/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.conf.manager;

import com.brain.conf.dto.CalendarioFacturacionDto;
import com.brain.conf.dto.CondicionPagoDto;
import com.brain.conf.dto.TarifaDto;
import com.brain.conf.dto.TerceroDto;
import com.brain.core.manager.*;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.PropietarioMBean;
import com.brain.core.view.mbean.SessionMBean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class TerceroManager extends ComunManager<TerceroDto> implements Serializable {

    private static Logger logger = Logger.getLogger(TerceroManager.class);
    private Long idEntidad = 127L;
    private String stringRazonsocial = "RAZON SOCIAL";
    private String stringNombreApellidos = "APELLIDOS Y NOMBRES";
    private String stringPersonaNatural = "NATURAL";
    private String stringPersonaJuridica = "JURIDICO";
    @Resource
    private DAOGenerico<TerceroDto> springHibernateDao;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private ParametroManager parametroManager;
    @Resource
    private CatalogoManager catalogoManager;
    private final String url = "/pages/conf/tercero/terceros.xhtml";
    private final String urlLista = "/pages/conf/tercero/listaTerceros.xhtml";

    /**
     * Retorna todos los terceros
     *
     * @return
     * @throws DAOException
     */
    public List<TerceroDto> obtenerTodos() throws DAOException {
        return springHibernateDao.listarTodosDtos(TerceroDto.class);
    }

    /**
     * obtener terceros por Id
     *
     * @param id
     * @return
     * @throws DAOException
     */
    public TerceroDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(TerceroDto.class, id);
    }

    /**
     * Metodo para obtener Terceros activos
     *
     * @return
     * @throws DAOException
     */
    public List<TerceroDto> obtenerActivos() throws DAOException {
        Map<String, Object> filtros = new HashMap<String, Object>();
        filtros.put("estado", Boolean.TRUE);
        Map<String, String> orden = new HashMap<String, String>();
        orden.put("razonSocial", "asc");
        return springHibernateDao.obtenerDtosConFiltrosConOrden(TerceroDto.class, filtros, orden);
    }

    /**
     * Metodo para obtener lista calendario seleccionado
     *
     * @param listCalenFact
     * @param TarifaTerceroDto
     * @return
     * @throws DAOException
     */
    public List<CalendarioFacturacionDto> obtenerlistaCalendarioSeleccionado(List<CalendarioFacturacionDto> listCalenFact, CalendarioFacturacionDto TarifaTerceroDto) throws DAOException {
        if (TarifaTerceroDto != null) {
            for (CalendarioFacturacionDto lcf : listCalenFact) {
                if (lcf.getId().equals(TarifaTerceroDto.getId())) {
                    lcf.setSeleccionadoTercero(Boolean.TRUE);
                }
            }
        }
        return listCalenFact;
    }

    /**
     * Metodo para obtener lista Tarifa seleccionada
     *
     * @param listTarifa
     * @param TarifaTerceroDto
     * @return
     * @throws DAOException
     */
    public List<TarifaDto> obtenerlistaTarifaSeleccionado(List<TarifaDto> listTarifa, TarifaDto TarifaTerceroDto) throws DAOException {
        if (TarifaTerceroDto != null) {
            for (TarifaDto lcf : listTarifa) {
                if (lcf.getId().equals(TarifaTerceroDto.getId())) {
                    lcf.setSeleccionadoTercero(Boolean.TRUE);
                }
            }
        }
        return listTarifa;
    }

    /**
     * Metodo para obtener lista condicion de pago seleccionado
     *
     * @param listCondicionPago
     * @param CondicionPagoTerceroDto
     * @return
     * @throws DAOException
     */
    public List<CondicionPagoDto> obtenerlistaCondicionPagoSeleccionado(List<CondicionPagoDto> listCondicionPago, CondicionPagoDto CondicionPagoTerceroDto) throws DAOException {
        if (CondicionPagoTerceroDto != null) {
            for (CondicionPagoDto dcPg : listCondicionPago) {
                if (dcPg.getId().equals(CondicionPagoTerceroDto.getId())) {
                    dcPg.setSeleccionadoTercero(Boolean.TRUE);
                }
            }
        }
        return listCondicionPago;
    }

    /**
     * Metodo para inicializar Tercero
     *
     * @return
     */
    public TerceroDto inicializar() {
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        TerceroDto dto = new TerceroDto();
        dto = new TerceroDto();
        dto.setTipoDocumentoDto(new ParametroDto(catalogoManager.getIdParametroInicial()));
        return dto;
    }

    /**
     * Metodo para limpiar Tercero
     *
     * @param dto
     */
    public void limpiarCamposTerceros(TerceroDto dto) {
        dto.setNumeroDocumento(null);
        dto.setNombres("");
        dto.setApellidoPaterno("");
        dto.setApellidoMaterno("");
        dto.setRazonSocial("");
        dto.setFechaNacieminto(null);
        dto.setSexo(null);
    }

    /**
     * Metodo para obtener terceros por un mapa de filtro
     *
     * @param dtoFiltro
     * @return
     * @throws DAOException
     */
    public List<TerceroDto> obtener(TerceroDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from TerceroDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();
        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }
        if (dtoFiltro.getNombres() != null && dtoFiltro.getNombres().length() != 0) {
            hqsql += " and e.nombreCompleto like '%" + dtoFiltro.getNombres() + "%'";
        }
        if (dtoFiltro.getNumeroDocumento() != null && !dtoFiltro.getNumeroDocumento().equals(0L)) {
            hqsql += " and e.numeroDocumento like '%" + dtoFiltro.getNumeroDocumento() + "%'";
        }
        if (dtoFiltro.getTipoDocumentoDto() != null && !dtoFiltro.getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getTipoDocumentoDto().getId().equals(parametroManager.getIdTodos())) {
            hqsql += " and e.tipoDocumentoDto.id = ?";
            listaParametros.add(dtoFiltro.getTipoDocumentoDto().getId());
        }
        if (dtoFiltro.getSexo() != null) {
            hqsql += " and e.sexo = '" + dtoFiltro.getSexo() + "'";
        }
        if (dtoFiltro.getEstadoDto().getId() != null && !dtoFiltro.getEstadoDto().getId().equals(0L)) {
            hqsql += " and e.estadoDto.id = ?";
            listaParametros.add(dtoFiltro.getEstadoDto().getId());
        }
        if (dtoFiltro.getCliente()) {
            hqsql += " and e.cliente = ?";
            listaParametros.add(dtoFiltro.getCliente());
        }

        if (dtoFiltro.getProveedor() == true) {
            hqsql += " and e.proveedor = ?";
            listaParametros.add(dtoFiltro.getProveedor());
        }

        hqsql += " order by e.nombres asc";
        //Agregamos la condicion que valida propietarios
        if (!sessionMBean.getSessionUsuarioDto().getRolDto().getId().equals(sessionMBean.getRolSystem())) {
            if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
                if (!sessionMBean.getSessionUsuarioDto().getRolDto().getUsuarioDefault()) {
                    hqsql += " and exists(select 'X' from PropietarioDto as prop ";
                    hqsql += "where prop.pk.organizacionDto.id = ? ";
                    hqsql += " and prop.pk.entidad = ? ";
                    hqsql += " and prop.pk.registro = e.id)";
                    listaParametros.add(sessionMBean.getOrganizacionDto().getId());
                    listaParametros.add(idEntidad);
                }
            }
        }

        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo para obtener Terceros por un mapa de filtros y orden
     *
     * @param filtros
     * @param orden
     * @return
     * @throws DAOException
     */
    public List<TerceroDto> obtenerConFiltroConOrden(Map<String, Object> filtros, Map<String, String> orden) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltrosConOrden(TerceroDto.class, filtros, orden);
    }

    /**
     * Metodo para guardar, editar terceros
     *
     * @param dto
     * @return
     */
    public String guardar(TerceroDto dto) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        dto.setDescripcion(this.ingresarDescripcion(dto));
        if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
            try {
                dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
                dto.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
                dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                UtilCore.General.toUpperCaseDto(dto);


                dto.setNombreCompleto(this.ingresarNombrecompletoRazonSocial(dto));
                nuevo(dto);
                //Registramos como propietario de la organizacion que esta en sesion
                generarPropietarioPorDefault(dto);

                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);

                to = "";//retroceder();
            } catch (Exception ex) {
                mensajeTrx = ex.getMessage();
                recursosManager.showError(ex.getMessage());
                logger.error(mensajeTrx);

                to = null;
            }
        } else if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
            try {
                UtilCore.General.toUpperCaseDto(dto);
                editar(dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);
                to = "";//retroceder();
            } catch (Exception ex) {
                mensajeTrx = ex.getMessage();
                recursosManager.showError(ex.getMessage());
                logger.error(mensajeTrx);
                to = null;
            }
        }

        return to;
    }

    public void generarPropietarioPorDefault(TerceroDto dto) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        sessionMBean.setEntidad(idEntidad);
        sessionMBean.setRegistro(dto.getId());
        PropietarioMBean propietarioMBean = (PropietarioMBean) WebServletContextListener.getApplicationContext().getBean("propietarioMBean");
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            propietarioMBean.setOrganizacionDto(sessionMBean.getOrganizacionDto());
            propietarioMBean.setEstado(Boolean.TRUE);
            propietarioMBean.setPrincipal(Boolean.TRUE);
            propietarioMBean.nuevoPropietario();
        }
    }

    public List<TerceroDto> autoCompletarTerceroPorEmpresa(final String sqr) throws DAOException {

        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from TerceroDto as e where e.id=e.id";
        hqsql += " and  ((upper(e.id || e.descripcion)) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.nombreCompleto) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.numeroDocumento) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.paisDto.descripcion) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.paisDto.descripcionCorta) like '%" + sqr.toUpperCase() + "%'";
        hqsql += ")";
        List<Object> listaParametros = new ArrayList<Object>();
        hqsql += " and e.empresaDto.id = ? ";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        //Agregamos la condicion que valida propietarios
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and exists(select 'X' from PropietarioDto as prop ";
            hqsql += "where prop.pk.organizacionDto.id = ? ";
            hqsql += " and prop.pk.entidad = ? ";
            hqsql += " and prop.pk.registro = e.id  and prop.estado = ?)";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
            listaParametros.add(idEntidad);
            listaParametros.add(Boolean.TRUE);
        }
        hqsql += " order by e.descripcion asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<TerceroDto> autoCompletarProveedor(final String sqr) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from TerceroDto as e where e.id=e.id";
        hqsql += " and  ((upper(e.id || e.descripcion)) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.nombreCompleto) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.numeroDocumento) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.paisDto.descripcion) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.paisDto.descripcionCorta) like '%" + sqr.toUpperCase() + "%'";
        hqsql += ")";
        List<Object> listaParametros = new ArrayList<Object>();
        hqsql += " and e.empresaDto.id = ? ";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        hqsql += " and e.proveedor = ?";
        listaParametros.add(Boolean.TRUE);
        //Agregamos la condicion que valida propietarios
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and exists(select 'X' from PropietarioDto as prop ";
            hqsql += "where prop.pk.organizacionDto.id = ? ";
            hqsql += " and prop.pk.entidad = ? ";
            hqsql += " and prop.pk.registro = e.id  and prop.estado = ?)";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
            listaParametros.add(idEntidad);
            listaParametros.add(Boolean.TRUE);
        }
        hqsql += " order by e.descripcion asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<TerceroDto> autoCompletarCliente(final String sqr) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from TerceroDto as e where e.id=e.id";
        hqsql += " and  ((upper(e.id || e.descripcion)) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.nombreCompleto) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.numeroDocumento) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.paisDto.descripcion) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.paisDto.descripcionCorta) like '%" + sqr.toUpperCase() + "%'";
        hqsql += ")";
        List<Object> listaParametros = new ArrayList<Object>();
        hqsql += " and e.empresaDto.id = ? ";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        hqsql += " and e.cliente = ?";
        listaParametros.add(Boolean.TRUE);
        //Agregamos la condicion que valida propietarios
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and exists(select 'X' from PropietarioDto as prop ";
            hqsql += "where prop.pk.organizacionDto.id = ? ";
            hqsql += " and prop.pk.entidad = ? ";
            hqsql += " and prop.pk.registro = e.id  and prop.estado = ?)";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
            listaParametros.add(idEntidad);
            listaParametros.add(Boolean.TRUE);
        }
        hqsql += " order by e.descripcion asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo par ingresar descripcion de tercero
     *
     * @param dto
     * @return
     */
    public String ingresarDescripcion(TerceroDto dto) {
        String result = this.stringPersonaNatural;

        //Si es persona juridica
        if (dto.getTipoDocumentoDto().getValorBoolean().equals(true)) {
            result = dto.getRazonSocial();
        } else { // Si es persona natural
            result = dto.getNombres() + " " + dto.getApellidoPaterno() + " " + dto.getApellidoMaterno();
        }

        return result;
    }

    /**
     * Metodo para ingrezar la razon social o nombre completo
     *
     * @param dto
     * @return
     */
    public String ingresarNombrecompletoRazonSocial(TerceroDto dto) {
        String result = "";
        if (dto.getTipoDocumentoDto().getValorBoolean().equals(false)) {
            result = dto.getApellidoPaterno() + " " + dto.getApellidoMaterno() + " " + dto.getNombres();
        } else {
            result = dto.getRazonSocial();
        }
        return result;
    }

    /**
     * Metodo para validar el credito limite usado
     *
     * @param dto
     * @return
     */
    public Boolean validarCreditoLimiteUsusado(TerceroDto dto) {
        String mensajeTrx = "";
        if (dto.getClCreditoLimite().compareTo(dto.getClCreditoUsado()) >= 0) {
            return true;
        }
        mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.error.credito");
        recursosManager.showWarning(mensajeTrx);
        return false;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        TerceroManager.logger = logger;
    }

    public Long getIdEntidad() {
        return idEntidad;
    }

    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }

    public DAOGenerico<TerceroDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<TerceroDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public String getUrl() {
        return url;
    }

    public String getUrlLista() {
        return urlLista;
    }

   

    public String getStringRazonsocial() {
        return stringRazonsocial;
    }

    public void setStringRazonsocial(String stringRazonsocial) {
        this.stringRazonsocial = stringRazonsocial;
    }

    public String getStringNombreApellidos() {
        return stringNombreApellidos;
    }

    public void setStringNombreApellidos(String stringNombreApellidos) {
        this.stringNombreApellidos = stringNombreApellidos;
    }

    public String getStringPersonaNatural() {
        return stringPersonaNatural;
    }

    public void setStringPersonaNatural(String stringPersonaNatural) {
        this.stringPersonaNatural = stringPersonaNatural;
    }

    public String getStringPersonaJuridica() {
        return stringPersonaJuridica;
    }

    public void setStringPersonaJuridica(String stringPersonaJuridica) {
        this.stringPersonaJuridica = stringPersonaJuridica;
    }
}
